#!/bin/sh
# PCP QA Test No. 1697
# Valgrind pmproxy REST API testing.
# Based on 1601 and 1696
# check-group-exclude: pcp-uptime

# Copyright (c) 2022 Red Hat.
#

seq=`basename $0`
echo "QA output created by $seq"

# get standard environment, filters and checks
. ./common.product
. ./common.filter
. ./common.check
. ./common.python


_check_valgrind
_check_series
_check_key_server_version_offline

_cleanup()
{
    cd $here
    [ -n "$options" ] && $keys_cli $options shutdown
    $sudo rm -rf $tmp $tmp.*
}

status=1	# failure is the default!
username=`id -u -n`
trap "_cleanup; exit \$status" 0 1 2 3 15

# create a pmproxy configuration
cat <<EOF > $tmp.conf
[pmproxy]
pcp.enabled = true
http.enabled = true
[pmseries]
enabled = true
EOF

_filter_source()
{
    sed \
        -e "s,$here,PATH,g" \
        -e "s,$hostname,QAHOST,g" \
    #end
}

_filter_proxyport()
{
    sed \
	-e "s/ FD $proxyport / FD PORT /g" \
	-e '/PORT ipv6 /d' \
    # end
}

# real QA test starts here
echo "Start test key server ..."
key_server_port=`_find_free_port`
options="-p $key_server_port"
$key_server --port $key_server_port --save "" > $tmp.keys 2>&1 &
_check_key_server_ping $key_server_port
_check_key_server $key_server_port
echo

_check_key_server_version $key_server_port

# import some well-known test data into the key server
pmseries $options --load "$here/archives/proc" | _filter_source

# start pmproxy
mkdir -p $tmp.pmproxy/pmproxy
export PCP_RUN_DIR=$tmp.pmproxy
export PCP_TMP_DIR=$tmp.pmproxy
proxyport=`_find_free_port`
$valgrind_clean_assert pmproxy -f -p $proxyport -r $key_server_port -U $username -l- -c $tmp.conf >$tmp.valout 2>$tmp.valerr &
pid=$!

# valgrind takes awhile to fire up
i=0
while [ $i -lt 40 ]
do
    $PCP_BINADM_DIR/telnet-probe -c localhost $proxyport && break
    sleep 1
    i=`expr $i + 1`
done
if $PCP_BINADM_DIR/telnet-probe -c localhost $proxyport
then
    echo "Startup took $i secs" >>$seq_full
else
    echo "Arrgh: valgrind failed start pmproxy and get port $proxyport ready after 30 secs"
    exit
fi

series1=`pmseries $options disk.all.read`
[ -z "$series1" ] && _fail "Cannot find any timeseries matching disk.all.read"
echo "Using series $series1 for disk.all.read"

series2=`pmseries $options disk.dev.read`
[ -z "$series2" ] && _fail "Cannot find any timeseries matching disk.dev.read"
echo "Using series $series2 for disk.dev.read"

series3=`pmseries $options kernel.all.uptime`
[ -z "$series3" ] && _fail "Cannot find any timeseries matching kernel.all.uptime"
echo "Using series $series3 for kernel.all.uptime"


echo "== verify metric descs" | tee -a $seq_full
curl --silent "http://localhost:$proxyport/series/descs" -d "series=$series1,$series2,$series3" | tee -a $seq_full | pmjson -n

echo "== verify metric names" | tee -a $seq_full
curl --silent "http://localhost:$proxyport/series/metrics" -d "series=$series1,$series2,$series3" | tee -a $seq_full | pmjson -n

echo "== verify metric labels" | tee -a $seq_full
curl --silent "http://localhost:$proxyport/series/labels" -d "series=$series1,$series3" | tee -a $seq_full | pmjson -n

echo "== verify metric insts" | tee -a $seq_full
curl --silent "http://localhost:$proxyport/series/instances" -d "series=$series2" | tee -a $seq_full | pmjson -n

# valgrind takes awhile to shutdown too
pmsignal $pid
pmsleep 3.5
echo "=== valgrind stdout ===" | tee -a $seq_full
cat $tmp.valout | _filter_valgrind

echo "=== valgrind stderr ===" | tee -a $seq_full
cat $tmp.valerr | _filter_pmproxy_log | grep -v "Cannot connect to key server" | _filter_proxyport

# success, all done
status=0
exit
